//==============================================================================================
/**
 * @file	castle_common.c
 * @brief	「バトルキャッスル」共通処理
 * @author	Satoshi Nohara
 * @date	07.10.22
 */
//==============================================================================================
#include "system/main.h"
#include "system/arc_tool.h"
#include "system/arc_util.h"
#include "system/clact_tool.h"
#include "system/snd_tool.h"
#include "system/pm_str.h"
#include "system/buflen.h"
#include "system/wordset.h"
#include "system/bmp_list.h"
#include "system/fontproc.h"
#include "poketool/pokeparty.h"
#include "savedata/frontier_savedata.h"
#include "savedata/config.h"

#include "communication/comm_system.h"
#include "communication/comm_tool.h"
#include "communication/comm_info.h"
#include "communication/comm_def.h"

#include "gflib/blact.h"
#include "../../field/fieldobj.h"
#include "../../field/scr_tool.h"

#include "castle_common.h"
#include "castle_sys.h"
#include "castle_bmp.h"

#include "system/pm_overlay.h"
FS_EXTERN_OVERLAY(frontier_common);


//==============================================================================================
//	定数定義
//==============================================================================================
#define	YESNO_WIN_PX	( 25 )		// はい・いいえウィンドウ表示Ｘ座標
#define	YESNO_WIN_PY	( 10 )		// はい・いいえウィンドウ表示Ｙ座標


//==============================================================================================
//
//	プロトタイプ宣言
//
//==============================================================================================
u8 GetCsrPokePos( u8 h_max, u8 csr_pos );
u8 GetCsrSelType( u8 h_max, u8 csr_pos );
u8 GetCommSelCsrPos( u8 type_offset, u8 decide_type );
u8 Castle_GetRank( SAVEDATA* sv, u8 type, u8 rank_type );
void Castle_ListSeCall( u32 param, u16 no );
void Castle_SetPairName( WORDSET* wordset, u32 id );

//--------------------------------------------------------------
/**
 * @brief	エントリーポケモンの何匹目か取得
 *
 * @param	h_max	横の数
 * @param	csr_pos	カーソル位置
 *
 * @return	"何匹目か"
 */
//--------------------------------------------------------------
u8 GetCsrPokePos( u8 h_max, u8 csr_pos )
{
	//return (csr_pos % h_max);
	return csr_pos;
}

//--------------------------------------------------------------
/**
 * @brief	カーソル位置から「かいふく」「どうぐ」「つよさ」「わざ」のどれを選択したか取得
 * @brief	カーソル位置から「てもち」「レベル」「つよさ」「わざ」のどれを選択したか取得
 * @brief	カーソル位置から「かいふく」「どうぐ」「じょうほう」のどれを選択したか取得
 *
 * @param	h_max	横の数
 * @param	csr_pos	カーソル位置
 *
 * @return	"種類"
 */
//--------------------------------------------------------------
u8 GetCsrSelType( u8 h_max, u8 csr_pos )
{
	return (csr_pos / h_max);
}

//--------------------------------------------------------------
/**
 * @brief	通信の選んだカーソル位置を取得
 *
 * @param	type_offset		基準位置
 * @param	decide_type		選択位置
 *
 * @return	"カーソル位置"
 */
//--------------------------------------------------------------
u8 GetCommSelCsrPos( u8 type_offset, u8 decide_type )
{
	//オフセットを外す
	if( decide_type < type_offset ){
		return decide_type;
	}

	return (decide_type - type_offset);
}

//--------------------------------------------------------------
/**
 * @brief	現在のランク取得
 *
 * @param	sv			セーブデータ
 * @param	type		バトルタイプ
 * @param	rank_type	どのランクを取得するか(かいふく、レンタル、じょうほう)
 *
 * @return	"ランク"
 */
//--------------------------------------------------------------
u8 Castle_GetRank( SAVEDATA* sv, u8 type, u8 rank_type )
{
	return FrontierRecord_Get(	SaveData_GetFrontier(sv),
						CastleScr_GetRankRecordID(type,rank_type),
						Frontier_GetFriendIndex(CastleScr_GetRankRecordID(type,rank_type)) );
}

//--------------------------------------------------------------
/**
 * @brief	BMPLIST_NULLじゃない時は共通の効果音を鳴らす
 *
 * @param	param		BMPLISTのパラメータ
 * @param	no			SEナンバー
 *
 * @return	none
 */
//--------------------------------------------------------------
void Castle_ListSeCall( u32 param, u16 no )
{
	if( param != BMPLIST_NULL ){
		Snd_SePlay( no );
	}
	return;
}

//--------------------------------------------------------------
/**
 * @brief	パートナー名をセット
 *
 * @param	wordset		WORDSET型のポインタ
 * @param	id			bufID
 *
 * @return	none
 */
//--------------------------------------------------------------
void Castle_SetPairName( WORDSET* wordset, u32 id )
{
	MYSTATUS* my;
	u32 col;

	//パートナーのMyStatus取得
	my = CommInfoGetMyStatus( (CommGetCurrentID() ^ 1) );

	WORDSET_RegisterPlayerName( wordset, id, my );
	return;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ＢＧ表示切替パラメータ初期化
 *
 * @param	prm		パラメータ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_BgOnOffInit( u32 * prm )
{
	*prm = 0;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ＢＧ表示切替パラメータ設定
 *
 * @param	frm		ＢＧフレーム
 * @param	flg		ON/OFFフラグ
 * @param	prm		パラメータ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_BgOnOffSet( u32 frm, u32 flg, u32 * prm )
{
	u32	mask;

	frm *= 4;

	mask = 0xffffffff ^ ( 0xf << frm );

	flg = ( flg + 1 ) << frm;

	*prm = ( (*prm) & mask ) | flg;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ＢＧ表示切替メイン
 *
 * @param	prm		パラメータ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_BgOnOffMain( u32 * prm )
{
	u16	flg;
	u16	i;

	for( i=GF_BGL_FRAME0_M; i<=GF_BGL_FRAME3_S; i++ ){
		flg = ( (*prm) >> (i*4) ) & 0xf;
		if( flg == 0 ){ continue; }
		GF_BGL_VisibleSet( i, flg-1 );
	}
	CASTLECOMMON_BgOnOffInit( prm );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	はい・いいえ処理初期化
 *
 * @param	tsw		タッチウィンドウシステム
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_YesNoWinInit( CASTLE_TOUCH_SW * tsw )
{
	tsw->sys = TOUCH_SW_AllocWork( HEAPID_CASTLE );
	tsw->flg = FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	はい・いいえ処理解放
 *
 * @param	tsw		タッチウィンドウシステム
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_YesNoWinExit( CASTLE_TOUCH_SW * tsw )
{
	TOUCH_SW_FreeWork( tsw->sys );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	はい・いいえセット
 *
 * @param	tsw		タッチウィンドウシステム
 * @param	bgl		BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_YesNoWinSet( CASTLE_TOUCH_SW * tsw, GF_BGL_INI * bgl )
{
	TOUCH_SW_PARAM	prm;
	u16	cgx, siz;

#if	GS_AFTERMASTER_SYSTEM1644_20091027_FIX
	tsw->bgl = bgl;		// あとでウィンドウのキャラをクリアするために保持しておく
#endif

	CASTLEBMP_SelBoxDataGet( &cgx, &siz );		// selboxと同じでいい

	prm.p_bgl     = bgl;
	prm.bg_frame  = BC_FRAME_TYPE;
	prm.char_offs = cgx;
	prm.pltt_offs = BC_MENU_PAL;
	prm.x         = YESNO_WIN_PX;
	prm.y         = YESNO_WIN_PY;
	prm.kt_st     = 0;
	prm.key_pos   = 0;
	prm.type      = TOUCH_SW_TYPE_S;

	TOUCH_SW_Init( tsw->sys, &prm );
	tsw->flg = TRUE;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	はい・いいえワークを初期化時に戻す
 *
 * @param	tsw		タッチウィンドウシステム
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLECOMMON_YesNoWinReset( CASTLE_TOUCH_SW * tsw )
{
	if( tsw->flg == FALSE ){ return; }

	TOUCH_SW_Reset( tsw->sys );
#if	GS_AFTERMASTER_SYSTEM1644_20091027_FIX
	GF_BGL_LoadScreenReq( tsw->bgl, BC_FRAME_TYPE );
#endif
	tsw->flg = FALSE;
}